package 剑指II;

/**
 * @description:
 * @author: 小白白
 * @create: 2021-10-22
 **/

public class Jz002二进制加法 {

    /**
     * 给定两个 01 字符串 a 和 b ，请计算它们的和，并以二进制字符串的形式输出。
     * 输入为 非空 字符串且只包含数字 1 和 0。
     * <p>
     * 示例 1:
     * 输入: a = "11", b = "10"
     * 输出: "101"
     * 示例 2:
     * 输入: a = "1010", b = "1011"
     * 输出: "10101"
     *  
     * 提示：
     * 每个字符串仅由字符 '0' 或 '1' 组成。
     * 1 <= a.length, b.length <= 10^4
     * 字符串如果不是 "0" ，就都不含前导零。
     */

    public String addBinary(String a, String b) {

        int index1 = a.length() - 1;
        int index2 = b.length() - 1;

        StringBuilder sb = new StringBuilder();
        int lastNum = 0;

        while (index1 >= 0 && index2 >= 0) {

            int i1 = a.charAt(index1) - '0';
            int i2 = b.charAt(index2) - '0';

            int num = i1 + i2 + lastNum;

            if (num > 1) {
                sb.append(num % 2);
                lastNum = num / 2;
            } else {
                sb.append(num);
                lastNum = 0;
            }

            index1--;
            index2--;

        }

        while (index1 >= 0) {
            int i1 = a.charAt(index1--) - '0';
            int num = i1 + lastNum;
            if (num > 1) {
                sb.append(num % 2);
                lastNum = num / 2;
            } else {
                sb.append(num);
                lastNum = 0;
            }
        }

        while (index2 >= 0) {
            int i2 = b.charAt(index2--) - '0';
            int num = i2 + lastNum;
            if (num > 1) {
                sb.append(num % 2);
                lastNum = num / 2;
            } else {
                sb.append(num);
                lastNum = 0;
            }
        }

        if (lastNum != 0) {
            sb.append(lastNum);
        }

        return sb.reverse().toString();
    }

    public static void main(String[] args) {
        Jz002二进制加法 n = new Jz002二进制加法();
        String result = n.addBinary("1010", "1011");
        System.out.println(result);
    }

}
